package com.coolingme.springboot.sentinel;

import cn.hutool.core.lang.Console;
import cn.hutool.core.thread.ConcurrencyTester;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.RandomUtil;
import com.google.common.util.concurrent.RateLimiter;

/**
 * Google开源工具包Guava提供的限流工具类RateLimiter实现令牌桶算法
 * <p>
 * 令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌，而如果请求需要被处理，则需要先从桶里获取一个令牌，当桶里没有令牌可取时，则拒绝服务。
 *
 * @author wangyue
 * @date 2022/10/16 17:44
 */
public class RateLimiterDemo {

    /**
     * 令牌桶算法
     */
    public static RateLimiter rateLimiter = RateLimiter.create(10);


    /**
     * 请求调用
     *
     * @return 调用是否成功
     */
    public static String doRequest() {
        // 获取令牌
        if (rateLimiter.tryAcquire()) {
            return "success";
        } else {
            return "fail";
        }
    }

    public static void main(String[] args) {
        ConcurrencyTester tester = ThreadUtil.concurrencyTest(100, () -> {
            long delay = RandomUtil.randomLong(100, 1000);
            ThreadUtil.sleep(delay);
            // 测试的逻辑内容
            String result = doRequest();
            Console.log("{} test finished, delay: {}", Thread.currentThread().getName(), result);
        });
        // 获取总的执行时间，单位毫秒
        Console.log(tester.getInterval());
    }


}
